// package vip.liux.backend.infrastructure.config;
//
// import org.apache.commons.lang3.StringUtils;
// import org.jetbrains.annotations.NotNull;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.context.annotation.Configuration;
// import org.springframework.http.server.ServerHttpRequest;
// import org.springframework.http.server.ServerHttpResponse;
// import org.springframework.messaging.Message;
// import org.springframework.messaging.MessageChannel;
// import org.springframework.messaging.handler.annotation.MessageMapping;
// import org.springframework.messaging.handler.annotation.SendTo;
// import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
// import org.springframework.messaging.simp.SimpMessagingTemplate;
// import org.springframework.messaging.simp.annotation.SubscribeMapping;
// import org.springframework.messaging.simp.config.ChannelRegistration;
// import org.springframework.messaging.simp.config.MessageBrokerRegistry;
// import org.springframework.messaging.simp.stomp.StompCommand;
// import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
// import org.springframework.messaging.support.ChannelInterceptor;
// import org.springframework.messaging.support.MessageHeaderAccessor;
// import org.springframework.stereotype.Controller;
// import org.springframework.web.socket.WebSocketHandler;
// import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
// import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
// import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
// import org.springframework.web.socket.server.HandshakeInterceptor;
//
// import java.util.List;
// import java.util.Map;
//
// @Configuration
// @EnableWebSocketMessageBroker
// public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
//
//     @Autowired(required = false)
//     private AuthChannelInterceptor authChannelInterceptor;
//
//     /**
//      * 拦截器方式2
//      *
//      * @param registration ChannelRegistration
//      */
//     @Override
//     public void configureClientInboundChannel(ChannelRegistration registration) {
//         if (authChannelInterceptor != null) {
//             registration.interceptors(authChannelInterceptor);
//         }
//     }
//
//     @Override
//     public void configureMessageBroker(MessageBrokerRegistry registry) {
//         // 启用简单内存消息代理，广播订阅前缀为 /topic
//         registry.enableSimpleBroker("/topic");
//         // 应用前缀，客户端发到服务端的消息要加 /app
//         registry.setApplicationDestinationPrefixes("/app");
//         // 设置用户目标前缀，客户端订阅用户消息时使用
//         registry.setUserDestinationPrefix("/user");
//     }
//
//     @Override
//     public void registerStompEndpoints(StompEndpointRegistry registry) {
//         // 客户端连接端点
//         registry.addEndpoint("/ws")
//                 .setAllowedOrigins("*")
//                 .withSockJS();
//     }
//
//
//     @Controller
//     public static class MessageController {
//         private final SimpMessagingTemplate messagingTemplate;
//
//         public MessageController(SimpMessagingTemplate messagingTemplate) {
//             this.messagingTemplate = messagingTemplate;
//         }
//
//
//         @MessageMapping("/hello")
//         public void greet(String message, SimpMessageHeaderAccessor accessor) {
//             String username = (String) accessor.getSessionAttributes().get("username");
//             // 业务逻辑，如广播给所有用户
//             messagingTemplate.convertAndSend("/topic/greetings", username + "：" + message);
//         }
//
//         // 客户端订阅 /topic/subscribe 时会调用该方法
//         @SubscribeMapping("/subscribe")
//         public String subscribe() {
//             return "456";
//         }
//
//         // 客户端 send("/app/hello", body) 会被该方法处理
//         @MessageMapping("/hello")
//         // 处理完后，返回的消息会被发送到订阅了 /topic/greetings 的客户端
//         @SendTo("/topic/greetings")
//         public String greet(String message) {
//             return "服务器收到：" + message;
//         }
//     }
//
//     public static class AuthChannelInterceptor implements ChannelInterceptor {
//         /**
//          * 连接前监听
//          *
//          * @param message message
//          * @param channel channel
//          * @return message
//          */
//         @Override
//         public Message<?> preSend(@NotNull Message<?> message, @NotNull MessageChannel channel) {
//             StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
//             //1、判断是否首次连接
//             if (accessor != null && StompCommand.CONNECT.equals(accessor.getCommand())) {
//                 //2、判断token
//                 List<String> nativeHeader = accessor.getNativeHeader("Authorization");
//                 if (nativeHeader != null && !nativeHeader.isEmpty()) {
//                     String token = nativeHeader.get(0);
//                     if (StringUtils.isNotBlank(token)) {
//                         // todo,通过token获取用户信息，下方用currentUser来代替
//                         // accessor.setUser(principal);
//                     }
//                 }
//                 return null;
//             }
//             //不是首次连接，已经登陆成功
//             return message;
//         }
//     }
//
//     public static class WebSocketHandshakeInterceptor implements HandshakeInterceptor {
//         @Override
//         public boolean beforeHandshake(
//                 @NotNull ServerHttpRequest request, @NotNull ServerHttpResponse response,
//                 @NotNull WebSocketHandler wsHandler, @NotNull Map<String, Object> attributes
//         ) {
//             // todo 可以在这里添加逻辑来处理握手前的操作，比如验证用户身份等
//             return true;
//         }
//
//         @Override
//         public void afterHandshake(
//                 @NotNull ServerHttpRequest request, @NotNull ServerHttpResponse response,
//                 @NotNull WebSocketHandler wsHandler, Exception exception
//         ) {
//         }
//     }
// }